﻿#include "TcpSocket.h"   // 引入封装好的 TCP 工具类
#include <thread>        // 用于多线程运行多个客户端
#include <iostream>      // 标准输入输出
#include <vector>        // 用于存储发送和接收的数据
#include <string>        // 字符串处理
#include <chrono>        // 用于睡眠等待

// ---------------- 客户端线程函数 ----------------
void runClient(const std::string& name) {
    TcpSocket client;  // 创建 TcpSocket 对象，用于客户端连接和通信

    // 尝试连接服务器
    if (!client.connectServer("127.0.0.1", 8080)) {
        // 如果连接失败，打印错误信息并退出线程
        std::cerr << name << " failed to connect\n";
        return;
    }

    std::cout << name << " connected to server\n";  // 成功连接提示

    // 启动异步接收服务器消息
    // lambda 捕获 name，用于显示客户端名称
    client.startAsyncRecv([name](int fd, const std::vector<char>& data){
        std::string msg(data.begin(), data.end());   // 将接收到的字节数组转换为字符串
        std::cout << "[" << name << " Received] " << msg << "\n";  // 打印接收到的消息
    });

    // 同步发送消息给服务器
    client.sendData(std::vector<char>(name.begin(), name.end()));  // 将名字转换为字节数组发送
    std::cout << "[" << name << " Sent] " << name << "\n";  // 打印发送的消息

    // 异步发送消息给服务器
    std::string async_msg = name + " async message";  // 构造异步消息内容
    client.sendDataAsync(std::vector<char>(async_msg.begin(), async_msg.end()));  // 异步发送
    std::cout << "[" << name << " Sent async] " << async_msg << "\n";  // 打印异步发送提示

    // 等待一段时间，保证能接收到服务器的回显消息
    std::this_thread::sleep_for(std::chrono::seconds(5));

    // 停止异步接收，释放资源
    client.stopAsyncRecv();
    std::cout << name << " disconnected\n";  // 客户端断开提示
}

// ---------------- 主函数 ----------------
int main() {
    // 创建两个客户端线程，同时运行两个客户端
    std::thread client1(runClient, "Client1");  // 客户端1
    std::thread client2(runClient, "Client2");  // 客户端2

    // 等待两个客户端线程结束
    client1.join();
    client2.join();

    // 主函数结束
    return 0;
}
